回顧一下機器學習的流程,昨天大致講解機器學習的處理流程,並且說明在資料前處理上,如何整理缺失值、異常值及離群值,今天要來講解,如何做到資料正規化(Normalization)與標準化(standardization)。
清理離群值、異常值或空值的資料,如在資料預測屬性中(1:男性,2:女性),若在該屬性資料中出現4,則此筆資料是未定義性別,因此需刪除此筆異常值資料。
# isnull()當缺失值位置為True,非缺失值位置為False的DataFrame
dataframe = df.isnull()
# 刪除缺失的行
df_nan_row = df.dropna(axis=0)
# 刪除缺失的列(一般不因為某列有缺失值就刪除列,因為列常代表某指標,但可能會因為該列近全部的資料皆為空值時,回刪除該列資料)
df_nan_col = df.dropna(axis=1)
# 以平均值替代缺失值
df1_fill_lack2 = df1.fillna(df1.mean())
# drop_duplicates()直接對重複資料(行)進行刪除
df_isdup = df.duplicated()
在大數據的世界,資料會以多種不同的方式呈現,例如性別資料會以F代指男性、以M代指女性;或是以UCI Dataset的Mushroom資料集為例,在紀錄氣味的欄位(odor),出現了a、l、c、y、f、m、n、p、s,分別紀錄不同類型的氣味。
欄位名稱 | 說明 | 類型 |
---|---|---|
odor | 氣味 | almond=a,anise=l,creosote=c,fishy=y,foul=f,musty=m,none=n,pungent=p,spicy=s |
而在機器的世界中,無法了解到這些英文字母(類別的資料)對應之間的關係,我們只能將這些資料轉換為數值,讓機器識別,常見的資料正規化方法:
簡單來說,就是把資料表中的每個類別 mapping 到某個整數,不會增加新欄位。
可以使用sklearn框架的LabelEncoder模組,延續剛剛介紹的mushroom資料集為例
from sklearn.preprocessing import LabelEncoder
#data.columns
dic={'class', 'cap-shape', 'cap-surface', 'cap-color', 'bruises', 'odor',
'gill-attachment', 'gill-spacing', 'gill-size', 'gill-color',
'stalk-shape', 'stalk-root', 'stalk-surface-above-ring',
'stalk-surface-below-ring', 'stalk-color-above-ring',
'stalk-color-below-ring', 'veil-type', 'veil-color', 'ring-number',
'ring-type', 'spore-print-color', 'population', 'habitat'}
labelencoder = LabelEncoder()
data['class'] = labelencoder.fit_transform(data['class'])
data['cap-shape'] = labelencoder.fit_transform(data['cap-shape'])
data['cap-surface'] = labelencoder.fit_transform(data['cap-surface'])
data['cap-color'] = labelencoder.fit_transform(data['cap-color'])
data['bruises'] = labelencoder.fit_transform(data['bruises'])
data['odor'] = labelencoder.fit_transform(data['odor'])
data['gill-attachment'] = labelencoder.fit_transform(data['gill-attachment'])
data['gill-spacing'] = labelencoder.fit_transform(data['gill-spacing'])
data['gill-size'] = labelencoder.fit_transform(data['gill-size'])
data['gill-color'] = labelencoder.fit_transform(data['gill-color'])
data['stalk-shape'] = labelencoder.fit_transform(data['stalk-shape'])
data['stalk-root'] = labelencoder.fit_transform(data['stalk-root'])
data['stalk-surface-above-ring'] = labelencoder.fit_transform(data['stalk-surface-above-ring'])
data['stalk-surface-below-ring'] = labelencoder.fit_transform(data['stalk-surface-below-ring'])
data['stalk-color-above-ring'] = labelencoder.fit_transform(data['stalk-color-above-ring'])
data['stalk-color-below-ring'] = labelencoder.fit_transform(data['stalk-color-below-ring'])
data['veil-type'] = labelencoder.fit_transform(data['veil-type'])
data['veil-color'] = labelencoder.fit_transform(data['veil-color'])
data['ring-number'] = labelencoder.fit_transform(data['ring-number'])
data['ring-type'] = labelencoder.fit_transform(data['ring-type'])
data['spore-print-color'] = labelencoder.fit_transform(data['spore-print-color'])
data['population'] = labelencoder.fit_transform(data['population'])
data['habitat'] = labelencoder.fit_transform(data['habitat'])
data
原始資料與經過Label encoding結果
在屬性資料中,機器只能接收數值資料,但將這些類別資料轉換為數值,然而數值與數值之間有大小、距離的關係,若是沒有大小之間的關係,這樣的資料就不適用Label Encoding的方式,需要使用One-hot Encoding。
就是把資料表中的每個類別 mapping 對應的欄位,經過One-hot Encoding,會增加資料表的欄位。
可以使用sklearn中的OneHotEncoder模組處理
from sklearn.preprocessing import OneHotEncoder
onehotencoder = OneHotEncoder(categorical_features = [0])
x = onehotencoder.fit_transform(x).toarray()
呈現結果
在大數據資料中,是用不同資料欄位與資料值所組成,他們可能分佈狀況可能都不盡相同,因此,就必須將特徵資料按比例縮放,讓資料落在某一特定的區間。
舉例來說,學生A的數學成績比學生B高1分,學生B的英文成績比學生A的高1分,那整體來說A的成績還是B的成績比較好?
答案是: 學生A
將英文及數學成績分佈區間皆設定為[0,1]之間,此時,A的英文成績高 1/20 分;B的數學成績高 1/100 分。
學生 | 數學成績 | 英文成績 |
---|---|---|
A | 90 | 80 |
B | 91 | 79 |
成績分佈 | 0~100 | 60~80 |
如下圖,藍色的圈圈圖代表的是兩個特徵的等高線,左圖的特徵[X1,X2]區間相差非常大,所以對應的等高線非常尖,會導致在使用梯度下降法尋求最佳解時,需要很迭代多次才可以收斂;而右圖對兩個原始特徵進行了標準化,其對應的等高線顯得較圓,在梯度下降進行求解時,能較快的收斂。
python資料預處理 :資料標準化
https://www.itread01.com/content/1543176304.html
常見的資料標準化方式:
常見的資料標準化方法,簡單來說,將原始資料的最大、最小值mapping至區間[0,1]
**公式:**新資料=(原始資料-最小值)/(最大值-最小值)
from sklearn import preprocessing
#建立MinMaxScaler物件
minmax = preprocessing.MinMaxScaler()
# 資料標準化
data_minmax = minmax.fit_transform(df)
利用原始資料的均值(mean)和標準差(standard deviation)進行資料的標準化,適用於資料的最大值和最小值未知的情況,或有超出取值範圍的離群資料的情況。
**公式:**新資料=(原始資料-均值)/標準差
from sklearn import preprocessing
#建立StandardScaler物件
zscore = preprocessing.StandardScaler()
# 資料標準化
data_zs = zscore.fit_transform(df)
最大值絕對值標準化(MaxAbs),根據最大值的絕對值進行標準化
公式:新資料 = 原始資料 / |原始資料的最大值|
其中max為x鎖在列的最大值,資料區間為[-1, 1],因此適用於稀疏矩陣。
from sklearn import preprocessing
#建立MinMaxScaler物件
maxabs = preprocessing.MaxAbsScaler()
# 資料標準化
data_maxabs = maxabs.fit_transform(df)
有時候,資料集中存在離群點,就需要利用RobustScaler針對離群點做標準化處理,該方法對資料中心化的資料的縮放更強的引數控制能力。
from sklearn import preprocessing
#建立RobustScaler物件
robust = preprocessing.RobustScaler()
# 資料標準化
data_rob = robust.fit_transform(df)
https://medium.com/@contactsunny/label-encoder-vs-one-hot-encoder-in-machine-learning-3fc273365621
今天在研究室唱歌,突然坐後面的同學從椅子上跌下來,想說有這麼誇張嗎
結果他是在接網路線XD